package qw

import (
	"encoding/json"
	"errors"
	"log/slog"
	"net/url"
)

type AddContactWayParam struct {
	Type          int      `json:"type"`
	Scene         int      `json:"scene"`
	Style         int      `json:"style"`
	Remark        string   `json:"remark"`
	SkipVerify    bool     `json:"skip_verify"`
	State         string   `json:"state"`
	User          []string `json:"user"`
	Party         []int    `json:"party"`
	IsTemp        bool     `json:"is_temp"`
	ExpiresIn     int      `json:"expires_in,omitempty"`
	ChatExpiresIn int      `json:"chat_expires_in,omitempty"`
	Unionid       string   `json:"unionid,omitempty"`
	//Conclusions   struct {
	//	Text struct {
	//		Content string `json:"content"`
	//	} `json:"text"`
	//	Image struct {
	//		MediaId string `json:"media_id"`
	//	} `json:"image"`
	//	Link struct {
	//		Title  string `json:"title"`
	//		Picurl string `json:"picurl"`
	//		Desc   string `json:"desc"`
	//		Url    string `json:"url"`
	//	} `json:"link"`
	//	Miniprogram struct {
	//		Title      string `json:"title"`
	//		PicMediaId string `json:"pic_media_id"`
	//		Appid      string `json:"appid"`
	//		Page       string `json:"page"`
	//	} `json:"miniprogram"`
	//} `json:"conclusions"`
}

type UpdateContactWayParam struct {
	ConfigId      string   `json:"config_id"`
	Remark        string   `json:"remark"`
	SkipVerify    bool     `json:"skip_verify"`
	Style         int      `json:"style"`
	State         string   `json:"state"`
	User          []string `json:"user"`
	Party         []int    `json:"party"`
	ExpiresIn     int      `json:"expires_in,omitempty"`
	ChatExpiresIn int      `json:"chat_expires_in,omitempty"`
	Unionid       string   `json:"unionid,omitempty"`
	//Conclusions   struct {
	//	Text struct {
	//		Content string `json:"content"`
	//	} `json:"text"`
	//	Image struct {
	//		MediaId string `json:"media_id"`
	//	} `json:"image"`
	//	Link struct {
	//		Title  string `json:"title"`
	//		Picurl string `json:"picurl"`
	//		Desc   string `json:"desc"`
	//		Url    string `json:"url"`
	//	} `json:"link"`
	//	Miniprogram struct {
	//		Title      string `json:"title"`
	//		PicMediaId string `json:"pic_media_id"`
	//		Appid      string `json:"appid"`
	//		Page       string `json:"page"`
	//	} `json:"miniprogram"`
	//} `json:"conclusions"`
}

// AddContactWay 配置客户联系「联系我」方式
// 企业可以在管理后台-客户联系-加客户中配置成员的「联系我」的二维码或者小程序按钮，客户通过扫描二维码或点击小程序上的按钮，即可获取成员联系方式，主动联系到成员。
// 企业可通过此接口为具有客户联系功能的成员生成专属的「联系我」二维码或者「联系我」按钮。
// 如果配置的是「联系我」按钮，需要开发者的小程序接入小程序插件。
func (w *QYWXApi) AddContactWay(param AddContactWayParam) (string, string, error) {
	accessToken, err := w.GetAccessToken()
	if err != nil {
		return "", "", err
	}

	var values = url.Values{}
	values.Add("access_token", accessToken)
	reqUrl := "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/add_contact_way?" + values.Encode()

	// 调试
	//url += "&debug=1"

	data, _ := json.Marshal(param)

	res, err := w.getHttpSvc().HttpPost(reqUrl, nil, data)
	if err != nil {
		slog.Error(err.Error())
		return "", "", err
	}

	// 调试日志
	slog.Debug("AddContactWay:\n" + string(res.Body))

	type Result struct {
		Errcode  int    `json:"errcode"`
		Errmsg   string `json:"errmsg"`
		ConfigId string `json:"config_id"`
		QrCode   string `json:"qr_code"`
	}

	var result Result
	if err := json.Unmarshal(res.Body, &result); err != nil {
		slog.Error(err.Error())
		return "", "", err
	}
	if result.Errcode != 0 {
		return "", "", errors.New("配置客户联系「联系我」方式失败，返回结果：" + string(res.Body))
	}
	return result.ConfigId, result.QrCode, nil
}

// UpdateContactWay 更新企业已配置的「联系我」方式
func (w *QYWXApi) UpdateContactWay(param UpdateContactWayParam) error {
	accessToken, err := w.GetAccessToken()
	if err != nil {
		return err
	}

	var values = url.Values{}
	values.Add("access_token", accessToken)
	reqUrl := "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/update_contact_way?" + values.Encode()

	// 调试
	//url += "&debug=1"

	data, _ := json.Marshal(param)

	res, err := w.getHttpSvc().HttpPost(reqUrl, nil, data)
	if err != nil {
		slog.Error(err.Error())
		return err
	}

	// 调试日志
	slog.Debug("UpdateContactWay:\n" + string(res.Body))

	type Result struct {
		Errcode int    `json:"errcode"`
		Errmsg  string `json:"errmsg"`
	}

	var result Result

	if err := json.Unmarshal(res.Body, &result); err != nil {
		slog.Error(err.Error())
		return err
	}
	if result.Errcode != 0 {
		return errors.New("更新企业已配置的「联系我」方式失败，返回结果：" + string(res.Body))
	}
	return nil
}

// DelContactWay 删除企业已配置的「联系我」方式
func (w *QYWXApi) DelContactWay(configId string) error {
	accessToken, err := w.GetAccessToken()
	if err != nil {
		return err
	}

	var values = url.Values{}
	values.Add("access_token", accessToken)
	reqUrl := "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/del_contact_way?" + values.Encode()

	// 调试
	//url += "&debug=1"

	var param = map[string]any{
		"config_id": configId,
	}
	data, _ := json.Marshal(param)

	res, err := w.getHttpSvc().HttpPost(reqUrl, nil, data)
	if err != nil {
		slog.Error(err.Error())
		return err
	}

	// 调试日志
	slog.Debug("DelContactWay:\n" + string(res.Body))

	type Result struct {
		Errcode int    `json:"errcode"`
		Errmsg  string `json:"errmsg"`
	}

	var result Result
	if err := json.Unmarshal(res.Body, &result); err != nil {
		slog.Error(err.Error())
		return err
	}
	if result.Errcode != 0 {
		return errors.New("删除企业已配置的「联系我」方式失败，返回结果：" + string(res.Body))
	}
	return nil
}
